import { abs, format, round } from 'mathjs';

/**
 *  计算给定数字的小数位数。
 * @param num - 要计算小数位数的数字。
 * @param precision - 精度，默认0。
 * @returns 给定数字的小数位数。
 */
function countDecimalPlaces(num: number): number {
  const decimalPart = String(abs(num)).split('.')[1];
  return decimalPart ? decimalPart.length : 0;
}

/**
 * 根据数值大小和小数位数，将数值转化为科学计数法显示。
 * @param num - 要转换的数值。
 * @param precision - 精度，默认0。
 * @returns 以科学计数法显示的数值字符串。
 */
const toScientificValue = (num?: number, precision: number = 0) => {
  if (num === 0) return '0';
  if (!num) return '';
  // 获取数值的长度
  const valueLength = String(abs(num)).length;
  // 获取小数位数
  const decimalPlaces = countDecimalPlaces(num);
  // 整数位数
  const integerPlaces =
    decimalPlaces === 0 ? valueLength : valueLength - decimalPlaces - 1; // 1是小数点
  let newNum = num;
  const absValue = abs(num);
  let formattedNum = '';
  if (absValue < 1) {
    // 绝对值小于1
    newNum = round(newNum, precision);
    if (decimalPlaces >= 4) {
      formattedNum = format(newNum, { notation: 'exponential' });
    } else {
      formattedNum = format(newNum, { notation: 'fixed' });
    }
  } else {
    // 根据 整数位数 进行四舍五入
    const n = precision - integerPlaces;
    newNum = round(newNum, n > 0 ? n : 0);
    if (abs(newNum) >= 10000) {
      formattedNum = format(newNum, { notation: 'exponential' });
    } else {
      formattedNum = format(newNum, { notation: 'fixed' });
    }
  }

  return formattedNum;
};

export { toScientificValue };
